package com.itheima.d1_polymorphism;
/*
    目标：掌握使用多态的好处，以及多态下的类型转换问题。

    好处 :
        1 在多态形式下，右边对象是解耦合的，更便于扩展和维护。
        2 定义方法时，使用父类类型的形参，可以接收一切子类对象，扩展性更强、更便利。

    缺点 :
        1 多态下不能使用子类的独有功能。

    类型转换
        1 自动类型转换：父类 变量名 = new 子类();
        2 强制类型转换：子类 变量名 = (子类) 父类变量
    强制类型转换的一个注意事项
        存在继承/实现关系就可以在编译阶段进行强制类型转换，编译阶段不会报错。
        运行时，如果发现对象的真实类型与强转后的类型不同，就会报类型转换异常（ClassCastException）的错误出来。
        解决异常的方式 : 使用instanceof关键字，判断当前对象的真实类型，再进行强转。
 */
public class Test2 {
    public static void main(String[] args) {

//        Teacher t1 = new Teacher();
//        method(t1);

        Student s1 = new Student();
        method(s1);

        Worker w1 = new Worker();
        method(w1);
    }
    //方法中的参数为：父类型    传递的对象是子类对象时，存在：多态
    public static void method(People people){ // people = new Student()、new Teacher()
        people.eat();


        //想要使用Student类中的特有方法：study
        //people.study();  //多态的弊端：不能使用子类对象中特有方法
        //解决方案： 强制类型转换     子类  子对象 = (子类) 父引用
        //在进行强制类型转换时，容易发生： ClassCastException异常
        //java提供的解决方式：  instanceof    判断对象的真实类型
        if(people instanceof  Student){
            Student s = (Student) people;
            s.study();
        }
        //
    }


//    public static void method(Worker worker){
//        worker.eat();
//    }
//    public static void method(Student student){
//        student.eat();
//    }
//    public static void method(Teacher teacher){
//        teacher.eat();
//    }
}
